我有一台對外服務的 MS-SQL 資料庫主機,最近從事件檢視器裡面發現一直有不明的攻擊者利用暴力破解法想要登入 MS-SQL 管理角色。
事件檢視器裡幾乎全是 MSSQL$MSSQLSERVER 登入失敗事件,
觀察下來每一天有超過上千次的登入失敗,有時同一秒鐘就有 10 幾次的登入失敗。
從 SSMS 管理工具可以顯示 Log,開啟 「SSMS > 管理 > SQL Server 記錄檔」
顯示 Log 訊息
事件檢視器裡 MS-SQL 登入失敗的訊息歸納有這 2 種。
而訊息 2 中的 ‘admin’ 帳號則會一直改變,例如 root, sys, system 都有可能出現。
表示攻擊者一直嘗試不同帳號登入,若確認帳號存在後,則會繼續用密碼暴力破解攻擊。
事件檢視器會記錄來源 IP,我發現 IP 不止一個,表示有不同的主機同時發動攻擊。
如果從 IP 反查 的話,會發現來源 IP 在全世界都有,包含歐洲、美洲、亞洲都出現過。
如果未即時處理,可能會有以下風險
此攻擊為嚴重性風險,如有發現需要立即處理。
如果想要避免攻擊者登入 MS-SQL 主機,有幾種方式可以執行。
接下來我會示範在 Windows Server 2019 如何避免 MS-SQL 受暴力登入攻擊
白名單表示符合指定 IP 才可連線,這是一個很有效的防護方式,只是某些客戶環境因無法指定 IP而無法這樣做。
在「具有進階安全性的 Windows Defender 防火牆」,建立新連線規則
規則: 連接埠
本機連接埠: TCP / 特定本機連接埠:1433
動作:允許連線
名稱: MS-SQL
完成之後,再點擊新建立的規則,在「領域」內設定白名單 IP。
開啟「開始 > Microsoft SQL Server 2019 > SQL Server 2019 設定管理員」
開啟左側「SQL Server 網路組態 > MSSQLSERVER 的通訊協定 > TCP/IP」
修改「IP 位址 > IPALL > TCP 通訊埠」的值
預設為 1433,修改成其他的通訊埠,並確保並未被使用,可選的範例在 0 ~ 65535。
修改組態設定檔需要重啟服務才會生效。
注意: 修改連線 port 要注意其他應用程式連線設定也要跟著修改,已允許連線的防火牆 port 也要一起修改。
以管理者角色登入 SSMS 後,在「安全性 > 登入(按右鍵) > 新增登入」
選擇「SQL Server 驗證」,輸入「登入名稱」,密碼需勾選「強制執行密碼原則」
伺服器角色勾選「sysadmin」要取代原有 sa 角色
在「使用者對應」勾選所有的資料庫,並勾選下方的「db_owner」
此設定可以取代原有 sa 帳號權限
我們剛剛已經新增了管理者帳號,所以這裡就需要用新管理者帳號重新登入。
使用新管理者登入,才可以刪除舊有的 sa 帳號。
將預設的 sa 帳號停用並改名後,避免攻擊者直接暴力破解 sa 密碼
執行「安全性 > 登入 > sa (按右鍵) > 屬性」
在「狀態」將「登入」設定「已停用」
執行「安全性 > 登入 > sa (按右鍵) > 重新命名」
換成別的名字
當我們建立新使用者給應用程式使用時,不要求方便就給予最大權限。
針對使用者帳號能用的權限再賦予就好。
在建立新使用者時,一定要勾選「強制執行密碼原則」
密碼原則說明
密碼複雜性原則是為了阻止暴力攻擊而設計,方法是盡可能地增加密碼數目。當強制執行密碼複雜性原則時,新的密碼必須符合下列指導方針:
密碼長度最多可達 128 個字元。 盡可能使用長且複雜的密碼。
bulkadmin: 可以執行大量插入作業
dbcreator: 可建立與修改資料庫
diskadmin: 管理磁碟中的檔案
processadmin: 管理 SQL Server 中執行的程序
public: 觀看系統中有哪些資料庫
securityadmin: 管理 SQL Server 登入相關事項
serveradmin: 調整與設定 SQL Server
setupadmin: 可新增、移除本機之外所連結的 SQL Server
sysadmin: 可處理 SQL Server 中的任何事情(最大權限)
db_accessadmin: 可以新增或移除資料庫的登入帳戶
db_backupoperator: 可備份資料庫
db_datareader: 觀看資料庫中的資料表內容
db_datawriter: 新增、修改、刪除資料庫中資料表的內容
db_ddladmin: 此角色可以新增、修改、刪除資料庫中的物件
db_denydatareader: 不允許觀看資料庫中資料表的內容
db_denydatawriter: 不允許改變資料庫中資料表的內容
db_owner: 擁有維護與設定資料庫的權限(包含資料庫的所有權限) (最大權限)
db_securityadmin: 可管理資料庫物件的擁有者.資料庫角色.角色的成員.權限
public: 資料庫的使用者都屬於public角色(擁有預設的資料庫權限)
以上的防護方法不一定執行完就絕對安全,攻擊者的方法會進化,在未來某一天可能會失效。
想要更完善的保護需要定期的觀察,或是寫程式偵測伺服器狀態,以避免因忙碌而疏忽。
除了做好防護,定期的備份也要確實執行,自動更新 Windows 系統安全性及病毒碼。
對於資安的議題,請各位不要覺得麻煩,方便性與安全性的對立的,不方便就會相對安全。
Windows Server 2012 R2 安裝微軟免費防毒軟體 Microsoft Security Essentials
SQL Server 每日定期備份與定期刪除舊有備份檔
Windows Server 如何安裝 SQL Server 2019 免費開發版